package a1;

import java.nio.charset.Charset;
import com.common.ByteBuf;
import com.common.Unpooled;

public class ByteBufTest1 {

	public static void main(String[] args) {
		// [-27, -68, -96, 104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100, 57]
		ByteBuf byteBuf = Unpooled.copiedBuffer("张hello world9", Charset.forName("utf-8"));
		/*
		 * 比如 “汉” 这个字要在网络上传输，最终是要使用二进制表示电压
		 * 
		 * unicode 编码表中 “汉”字的编码是0x6C49， 转成UTF-8格式，对照映射表， 0x6C49在0x0800-0xFFFF之间，
		 * UTF-8使用用3字节模板了：1110xxxx 10xxxxxx 10xxxxxx 0x6C49 是16进制表示， 6C49 写成二进制是：0110
		 * 1100 0100 1001 用这个比特流依次代替模板中的x，得到：11100110 10110001 10001001，即E6 B1 89
		 * 
		 * 在 java 中，首先要把汉字转成字节，计算出来的 是 -26，-79，-119，我们发现和E6 B1 89 不同 那么是如何换算呢 E6 => 1110
		 * 0110 因为JAVA中 byte 是 -128 ~ 127，高位是符号位 计算方式为 采用补码计算 取反后+1 去掉符号位，0001 1001 + 1
		 * = 16+8+1 + 1 = 26 高位1 位负数， 所以 E6 对应 -26， 在通过字节传输给网络流，转成二进制
		 */

		// 数字英文一个字节

		if (byteBuf.hasArray()) {// 是堆上緩沖，就会有字节数组，
			byte[] content = byteBuf.array();
			System.out.println(new String(content, Charset.forName("utf-8")));
			System.out.println(byteBuf);// UnpooledUnsafeHeapByteBuf：未池化

			System.out.println(byteBuf.arrayOffset());// 第一个字节的偏移量，
			System.out.println(byteBuf.readerIndex());
			System.out.println(byteBuf.writerIndex());
			System.out.println(byteBuf.capacity());
			int length = byteBuf.readableBytes();// 写索引-读索引。
			System.out.println(length);

			for (int i = 0; i < byteBuf.readableBytes(); ++i) {
				System.out.println(byteBuf.getByte(i));// 上面的数字，
				System.out.println((char) byteBuf.getByte(i));// 英文正常输出，
			}

			System.out.println(byteBuf.getCharSequence(0, 4, Charset.forName("utf-8")));
			System.out.println(byteBuf.getCharSequence(4, 6, Charset.forName("utf-8")));
		}
	}
}
